package br.edu.catolica.sadbc.core.util;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.util.Locale;


public class NumberUtils {
	
	//Terceirizacao refatorar
	public static final java.util.Locale BRASIL = new java.util.Locale("pt", "BR", "");   
	private static final BigDecimal VALOR_DEFAULT_BIGDECIMAL = new BigDecimal(0);
	private static final Double VALOR_DEFAULT_DOUBLE = new Double(0);
	private static final Long VALOR_DEFAULT_LONG = new Long(0);

	private static final Locale BRAZIL = new Locale("pt", "BR");
	private static final DecimalFormatSymbols REAL = new DecimalFormatSymbols(BRAZIL);
	private static final DecimalFormat DINHEIRO_REAL_SEM_CIFRAO = new DecimalFormat("###,###,##0.00", REAL);
	private static final String VALOR_ZERO = "0,00";
	private static final String ZERO = "0";
	private static final String SIFRAO = "R$";
	private static final String VIRGULA = ",";
	private static final String PONTO = ".";
	private static final String ESPACO = "   ";
	
	private static NumberUtils instance;
	
	private NumberUtils(){}
	
	public static NumberUtils getInstance(){
		if(instance == null){
			instance = new NumberUtils();
		}
		return instance;
	}
	
	/**
	 * Transforma uma String para um inteiro retornando zero se falhar
	 * @param str
	 * @return
	 */
	public int toInt(String str){
		return org.apache.commons.lang.math.NumberUtils.toInt(str);
	}
	
	/**
	 * Transforma uma String para long zero se falhar
	 * @param str
	 * @return
	 */
	public long toLong(String str){
		return org.apache.commons.lang.math.NumberUtils.toLong(str);
	}
	
	/**
	 * Transforma uma String para double zero se falhar
	 * @param str
	 * @return
	 */
	public double toDouble(String str){
		return org.apache.commons.lang.math.NumberUtils.toDouble(str);
	}
	
	/**
	 * Transforma uma String para float zero se falhar
	 * @param str
	 * @return
	 */
	public float toFloat(String str){
		return org.apache.commons.lang.math.NumberUtils.toFloat(str);
	}
	
	/**
	 * Transforma uma String em BigDecimal
	 * @param str
	 * @return
	 */
	public BigDecimal toBigDecimal(String str){
		return org.apache.commons.lang.math.NumberUtils.createBigDecimal(str);
	}
	
	/**
	 * Transforma uma String em BigInteger
	 * @param str
	 * @return
	 */
	public BigInteger toBigInteger(String str){
		return org.apache.commons.lang.math.NumberUtils.createBigInteger(str);
	}
	
	/**
	 * Retorna o m�ximo valor no array
	 * @param array
	 * @return
	 */
	public double maximo(double[] array){
		return org.apache.commons.lang.math.NumberUtils.max(array);
	}
	
	/**
	 * Retorna o m�ximo valor no array
	 * @param array
	 * @return
	 */
	public int maximo(int[] array){
		return org.apache.commons.lang.math.NumberUtils.max(array);
	}
	
	/**
	 * Retorna o m�ximo valor no array
	 * @param array
	 * @return
	 */
	public float maximo(float[] array){
		return org.apache.commons.lang.math.NumberUtils.max(array);
	}
	
	/**
	 * Retorna o m�ximo valor no array
	 * @param array
	 * @return
	 */
	public long maximo(long[] array){
		return org.apache.commons.lang.math.NumberUtils.max(array);
	}
	
	/**
	 * Retorna o m�ximo valor no array
	 * @param array
	 * @return
	 */
	public short maximo(short[] array){
		return org.apache.commons.lang.math.NumberUtils.max(array);
	}
	
	/**
	 * Retorna o menor valor do array
	 * @param array
	 * @return
	 */
	public double minimo(double[] array){
		return org.apache.commons.lang.math.NumberUtils.min(array);
	}
	
	/**
	 * Retorna o menor valor do array
	 * @param array
	 * @return
	 */
	public int minimo(int[] array){
		return org.apache.commons.lang.math.NumberUtils.max(array);
	}
	
	/**
	 * Retorna o menor valor do array
	 * @param array
	 * @return
	 */
	public float minimo(float[] array){
		return org.apache.commons.lang.math.NumberUtils.min(array);
	}
	
	/**
	 * Retorna o menor valor do array
	 * @param array
	 * @return
	 */
	public long minimo(long[] array){
		return org.apache.commons.lang.math.NumberUtils.min(array);
	}
	
	/**
	 * Retorna o menor valor do array
	 * @param array
	 * @return
	 */
	public short minimo(short[] array){
		return org.apache.commons.lang.math.NumberUtils.min(array);
	}
	
	//Terceirizacao
	
	/**
	 * Verifica se a String � numero Java v�lido
	 * Numeros v�lidos incluem hexadecimais marcados com o qualificador 0x, nota��o cientifica e numeros marcados com o typo qualificados(Ex: 132L).
	 * @param str
	 * @return
	 */
	public boolean isNumero(String str){
		return org.apache.commons.lang.math.NumberUtils.isNumber(str);
	}
	
	/**
	 * Formata para um valor monet�rio Real.
	 * 
	 * @author Guilherme Broock - BRQ Curitiba - 7.11.2009
	 * @author Jefferson Steidel dos Santos - BRQ Curitiba - 13.11.2009
	 * @author Mauricio do Couto Pelissari - BRQ Curitiba - 13.11.2009
	 * @param String
	 * @return bidDecimalFormatado
	 */
	static public String formatDecimal(String valor) {

		if (valor == null || valor.length() < 1) {
			return VALOR_ZERO;
		}

		if (valor.length() < 2) {
			return ZERO + PONTO + ZERO + valor;
		}
		
		if (valor.length() < 3) {
			return ZERO + PONTO  + valor;
		}

		String aux = valor.substring(valor.length() - 2, valor.length());
		String aux2 = valor.substring(0, valor.length() - 2);
		String formatado = aux2 + PONTO + aux;

		return formatado;
	}

	/**
	 * Formata para um valor monet�rio Real.
	 * 
	 * @author Guilherme Broock - BRQ Curitiba - 7.11.2009
	 * @author Jefferson Steidel dos Santos - BRQ Curitiba - 13.11.2009
	 * @param bigDecimal
	 * @return bidDecimalFormatado
	 */
	@SuppressWarnings("static-access")
	static public String formatValueToMoneyString(BigDecimal bigDecimal) {
		// Se o valor � nulo e atribui-se valor zero.
		if (bigDecimal == null) {
			bigDecimal = VALOR_DEFAULT_BIGDECIMAL;
		}

		String bigDecimalFormatado;

		if (bigDecimal.compareTo(bigDecimal.ZERO) == 0) {
			bigDecimalFormatado = SIFRAO + ESPACO + VALOR_ZERO;
		} else {
			String aux = bigDecimal.toString().substring(bigDecimal.toString().length() - 2);
			String aux2 = bigDecimal.toString().substring(0, bigDecimal.toString().length() - 2);
			bigDecimalFormatado = SIFRAO + ESPACO + aux2 + VIRGULA + aux;
		}

		return bigDecimalFormatado;
	}

	/**
	 * Formata para um valor monet�rio Real sem o cifr�o.
	 * 
	 * @author Guilherme Broock - BRQ Curitiba - 7.11.2009
	 * @param bigDecimal
	 * @return bidDecimalFormatado
	 */
	static public String formatValueToString(Double valor) {
		// Se o valor � nulo, atribui-se valor zero.
		if (valor == null) {
			valor = VALOR_DEFAULT_DOUBLE;
		}
		String doubleFormatado = DINHEIRO_REAL_SEM_CIFRAO.format(valor).toString();

		doubleFormatado = doubleFormatado.replaceAll("[.]", "");
		doubleFormatado = doubleFormatado.replaceAll("[,]", "");

		return doubleFormatado;
	}	
	
	/**
	 * Formata para um valor monet�rio Real sem o cifr�o.
	 * 
	 * @author Guilherme Broock - BRQ Curitiba - 7.11.2009
	 * @param bigDecimal
	 * @return bidDecimalFormatado
	 */
	static public String formatValueToString(Long valor) {
		// Se o valor � nulo, atribui-se valor zero.
		if (valor == null) {
			valor = VALOR_DEFAULT_LONG;
		}
		String doubleFormatado = DINHEIRO_REAL_SEM_CIFRAO.format(valor).toString();

		doubleFormatado = doubleFormatado.replaceAll("[.]", "");
		doubleFormatado = doubleFormatado.replaceAll("[,]", "");

		return doubleFormatado;
	}	
	
	/**
	 * Formata para um valor monet�rio Real sem o cifr�o.
	 * 
	 * @author Guilherme Broock - BRQ Curitiba - 7.11.2009
	 * @param bigDecimal
	 * @return bidDecimalFormatado
	 */
	static public String formatValueToString(BigDecimal valor) {
		// Se o valor � nulo, atribui-se valor zero.
		if (valor == null) {
			valor = VALOR_DEFAULT_BIGDECIMAL;
		}
		String doubleFormatado = DINHEIRO_REAL_SEM_CIFRAO.format(valor).toString();

		doubleFormatado = doubleFormatado.replaceAll("[.]", "");
		doubleFormatado = doubleFormatado.replaceAll("[,]", "");

		return doubleFormatado;
	}
	
	
	/**
	 * Realiza um 'parse' em uma string em formato brasileiro e transforma-a em
	 * um double
	 * @author Luiz Andrade da Silva - BRQ - Bras�lia - 01.06.2010
	 * @param String
	 * @return double
	 * @throws ParseException 
	 */
	static public double parseDoubleAPartirDeStringEmFormatoBrasileiro(String str) throws ParseException{
		java.text.DecimalFormatSymbols ds = new java.text.DecimalFormatSymbols (BRASIL);   
		java.text.DecimalFormat df = new java.text.DecimalFormat() ;   
		df.setDecimalFormatSymbols(ds);   
		return df.parse(str).doubleValue();
	}

}
